// https://leetcode.cn/problems/minimum-size-subarray-sum/

// 算法思路总结：
// 1. 使用滑动窗口技巧（双指针）
// 2. right指针扩展窗口，累加元素和
// 3. 当和大于等于target时，left指针收缩窗口
// 4. 在收缩过程中记录最小窗口长度
// 5. 时间复杂度：O(n)，空间复杂度：O(1)

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

class Solution 
{
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int sum = 0, n = nums.size(), ret = INT_MAX;
        
        for (int left = 0, right = 0 ; right < n ; right++)
        {
            sum += nums[right];
            while (sum >= target)
            {
                ret = min(ret, right - left + 1);
                sum -= nums[left];
                left++;
            }
        }
        return ret == INT_MAX ? 0 : ret;
    }
};

int main()
{
    vector<int> v1 = {2,3,1,2,4,3}, v2 = {1,1,1,1,1,1,1,1};
    int t1 = 7, t2 = 11;

    Solution sol;
    cout << sol.minSubArrayLen(t1, v1) << endl;
    cout << sol.minSubArrayLen(t2, v2) << endl;

    return 0;
}